package com.itogis.interceptors.randomNumImage;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;



public class RandomNumberImageServlet extends HttpServlet {
	private static final long serialVersionUID = -1528613326134124179L;
	private Logger log = Logger.getLogger(RandomNumberImageServlet.class);
	
	private void setCheckNumber(HttpServletRequest request, String checkNumber) {
		
		ServletContext application=getServletContext();
		application.setAttribute("a", "a");
		
		HttpSession session = request.getSession();
		String inType = request.getParameter("checkRandomType") == null ? ""
				: request.getParameter("checkRandomType").toString();
		session.setAttribute("RandomNumber" + inType, checkNumber);
	}

	public static void validateCheckNumber(HttpServletRequest request,
			String checkNumberInput) throws Exception {
		if (checkNumberInput == null || checkNumberInput.length() == 0) {
			throw new Exception(
					 "请输入验证码");
		}
		HttpSession session = request.getSession();
		String inType = request.getParameter("checkRandomType") == null ? ""
				: request.getParameter("checkRandomType").toString();
		String checkNumber = (String) session.getAttribute("RandomNumber"
				+ inType);
		System.out.println("Session中的图片验证码：inType=[" + inType + "], checkNumber="
				+ checkNumber);
		if (!checkNumberInput.equalsIgnoreCase(checkNumber)) {
			throw new Exception(
					 "验证码输入错误");
		}
		session.setAttribute("RandomNumber" + inType, null);
	}

	/**
	 * The doGet method of the servlet. <br>
	 * 
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request
	 *            the request send by the client to the server
	 * @param response
	 *            the response send by the server to the client
	 * @throws ServletException
	 *             if an error occurred
	 * @throws IOException
	 *             if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("image/jpeg");
		response.setHeader("Pragma", "No-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);
		if (true) {
			VerifyImageGenerator generator = new VerifyImageGenerator();
			String code = generator.generateVerifyCode(4);
			log.info("generated verify code: " + code);
			// 保存认证码
			setCheckNumber(request, code);
			// 输出图象到页面
			generator.generateVerifyImage(code, "JPEG", response.getOutputStream());
			return;
		}
		// 在内存中创建图象
		int width = 60, height = 20;
		BufferedImage image = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_RGB);
		// 获取图形上下文
		Graphics g = image.getGraphics();
		// 生成随机类
		Random random = new Random();
		// 设定背景色
		g.setColor(getRandColor(200, 250));
		g.fillRect(0, 0, width, height);
		// 设定字体
		g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
		// 随机产生155条干扰线，使图象中的认证码不易被其它程序探测到
		g.setColor(getRandColor(160, 200));
		for (int i = 0; i < 155; i++) {
			int x = random.nextInt(width);
			int y = random.nextInt(height);
			int xl = random.nextInt(12);
			int yl = random.nextInt(12);
			g.drawLine(x, y, x + xl, y + yl);
		}
		// 取随机产生的认证码(4位数字)
		String sRand = "";
		for (int i = 0; i < 4; i++) {
			String rand = String.valueOf(random.nextInt(10));
			sRand += rand;
			// 将认证码显示到图象中
			g.setColor(new Color(20 + random.nextInt(110), 20 + random
					.nextInt(110), 20 + random.nextInt(110)));
			// 调用函数出来的颜色相同，可能是因为种子太接近，所以只能直接生成
			g.drawString(rand, 13 * i + 6, 16);
		}
		// 保存认证码
		setCheckNumber(request, sRand);
		// 图象生效
		g.dispose();
		// 输出图象到页面
		ImageIO.write(image, "JPEG", response.getOutputStream());
	}

	/**
	 * The doPost method of the servlet. <br>
	 * 
	 * This method is called when a form has its tag value method equals to
	 * post.
	 * 
	 * @param request
	 *            the request send by the client to the server
	 * @param response
	 *            the response send by the server to the client
	 * @throws ServletException
	 *             if an error occurred
	 * @throws IOException
	 *             if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

	// 给定范围获得随机颜色
	private Color getRandColor(int fc, int bc) {
		Random random = new Random();
		if (fc > 255) {
			fc = 255;
		}
		if (bc > 255) {
			bc = 255;
		}
		int r = fc + random.nextInt(bc - fc);
		int g = fc + random.nextInt(bc - fc);
		int b = fc + random.nextInt(bc - fc);
		return new Color(r, g, b);
	}
	//com.itogis.interceptors.randomNumImage.RandomNumberImageServlet.validateCheckNumber(request,checkNumberInput);
	
//	<td class="brown12B"><div align="right">验证码：</div></td>
//    <td class="brown12B"><input name="checkNumberInput" type="text" class="box" /></td>
//    <td class="brown12B"><img src="/randomNumberImage" id="checkNumImage"align="middle" border="0" />
//							</td>
//
//    <td class="brown12B"><button style="margin-bottom: -4" class="inputs"
//									onclick="document.all('checkNumImage').src='/randomNumberImage?r='+Math.random();">
//									看不到图片
//								</button></td>
//	<td colspan="2" >
	
}
